﻿using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Web.Mvc;
using ControleRepresentante.Logic.Models;
using ControleRepresentante.Logic.Repositories;
using ControleRepresentante.Logic.Statistics;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WebSite.Controllers;

namespace ControleRepresentante.UnitTests
{
    public static class TestScenarioTransportadoraHelper
    {
        public static void DeleteTransportadora(this TestScenario testScenario, Guid transportadoraId)
        {
            ITransportadoraRepository transportadoraRepository = testScenario.RepositoryProvider.GetRepository<ITransportadoraRepository>();
            StatisticsBase statistics;
            int countBefore = transportadoraRepository.GetModels(out statistics).Count();
            using (TransportadoraController transportadoraController = new TransportadoraController(testScenario.RepositoryProvider, testScenario.SessionConfiguration, testScenario.ControllerExtensionProvider))
            {
                transportadoraController.Delete(transportadoraId);
                transportadoraController.Delete(transportadoraId, null);
                Assert.AreEqual(countBefore - 1, transportadoraRepository.GetModels(out statistics).Count());
            }
        }

        public static Guid CreateTransportadora(this TestScenario testScenario, Transportadora transportadora)
        {
            ITransportadoraRepository transportadoraRepository = testScenario.RepositoryProvider.GetRepository<ITransportadoraRepository>();
            StatisticsBase statistics;
            int countBefore = transportadoraRepository.GetModels(out statistics).Count();
            using (TransportadoraController transportadoraController = new TransportadoraController(testScenario.RepositoryProvider, testScenario.SessionConfiguration, testScenario.ControllerExtensionProvider))
            {
                transportadoraController.Create();
                foreach (Contato contato in transportadora.Contatos)
                {
                    transportadoraController.ContatoInsert(contato.Tipo.ToString(), contato.Valor, contato.Observacao, contato.Principal);
                }
                foreach (Conta conta in transportadora.Contas)
                {
                    transportadoraController.ContaInsert(conta.Banco, conta.Agencia, conta.Numero, conta.Observacao, conta.Principal);
                }
                foreach (Endereco endereco in transportadora.Enderecos)
                {
                    transportadoraController.EnderecoInsert(endereco.Tipo.ToString(), endereco.Rua, endereco.Numero,
                                                      endereco.Complemento, endereco.Bairro, endereco.CEP,
                                                      endereco.Cidade, endereco.Estado, endereco.Observacao, endereco.Principal);
                }
                NameValueCollection collection = new NameValueCollection();
                foreach (AttributeValue attributeValue in transportadora.AttributeValues)
                {
                    collection.Add("_" + attributeValue.Attribute.Name, attributeValue.Value);
                }
                if (transportadora.TransportadoraJolitex != null && transportadora.TransportadoraJolitex.Codigo.HasValue)
                {
                    collection.Add("codigo", transportadora.TransportadoraJolitex.Codigo.Value.ToString());
                }
                FormCollection formCollection = new FormCollection(collection);
                ActionResult actionResult = transportadoraController.Create(transportadora.Nome, formCollection);
                IEnumerable<Transportadora> transportadoras = transportadoraRepository.GetModels(out statistics);
                Assert.AreEqual(countBefore + 1, transportadoras.Count());
                Transportadora addedTransportadora = transportadoras.FirstOrDefault(x => x.Nome == transportadora.Nome);
                Assert.AreEqual(transportadora.Nome, addedTransportadora.Nome);
                Assert.AreEqual(transportadora.Contatos.Count(), addedTransportadora.Contatos.Count());
                foreach (Contato contato in transportadora.Contatos)
                {
                    Contato addedContato = addedTransportadora.Contatos.Single(x => x.Valor == contato.Valor);
                    Assert.AreEqual(contato.Tipo, addedContato.Tipo);
                    Assert.AreEqual(contato.Valor, addedContato.Valor);
                    Assert.AreEqual(contato.Observacao, addedContato.Observacao);
                    Assert.AreEqual(contato.Principal, addedContato.Principal);
                }
                Assert.AreEqual(transportadora.Contas.Count(), addedTransportadora.Contas.Count());
                foreach (Conta conta in transportadora.Contas)
                {
                    Conta addedConta = addedTransportadora.Contas.Single(x => x.Numero == conta.Numero);
                    Assert.AreEqual(conta.Agencia, addedConta.Agencia);
                    Assert.AreEqual(conta.Banco, addedConta.Banco);
                    Assert.AreEqual(conta.Numero, addedConta.Numero);
                    Assert.AreEqual(conta.Observacao, addedConta.Observacao);
                    Assert.AreEqual(conta.Principal, addedConta.Principal);
                }
                Assert.AreEqual(transportadora.Enderecos.Count(), addedTransportadora.Enderecos.Count());
                foreach (Endereco endereco in transportadora.Enderecos)
                {
                    Endereco addedEndereco = addedTransportadora.Enderecos.Single(x => x.Rua == endereco.Rua);
                    Assert.AreEqual(endereco.Tipo, addedEndereco.Tipo);
                    Assert.AreEqual(endereco.Rua, addedEndereco.Rua);
                    Assert.AreEqual(endereco.Numero, addedEndereco.Numero);
                    Assert.AreEqual(endereco.Complemento, addedEndereco.Complemento);
                    Assert.AreEqual(endereco.Bairro, addedEndereco.Bairro);
                    Assert.AreEqual(endereco.CEP, addedEndereco.CEP);
                    Assert.AreEqual(endereco.Cidade, addedEndereco.Cidade);
                    Assert.AreEqual(endereco.Estado, addedEndereco.Estado);
                    Assert.AreEqual(endereco.Observacao, addedEndereco.Observacao);
                    Assert.AreEqual(endereco.Principal, addedEndereco.Principal);
                }
                Assert.AreEqual(transportadora.AttributeValues.Count(), addedTransportadora.AttributeValues.Count());
                foreach (AttributeValue attributeValue in transportadora.AttributeValues)
                {
                    AttributeValue addedAttributeValue = addedTransportadora.AttributeValues.Single(x => x.Attribute.Name == attributeValue.Attribute.Name);
                    Assert.AreEqual(attributeValue.Value, addedAttributeValue.Value);
                }
                Assert.IsInstanceOfType(actionResult, typeof(RedirectToRouteResult));
                RedirectToRouteResult redirectToRouteResult = (RedirectToRouteResult)actionResult;
                Assert.AreEqual("Details", redirectToRouteResult.RouteValues["action"]);
                Assert.AreEqual(addedTransportadora.Id, redirectToRouteResult.RouteValues["id"]);
                return addedTransportadora.Id;
            }
        }

        internal static Guid CreateTransportadora(this TestScenario testscenario, string nome)
        {
            return testscenario.CreateTransportadora(new Transportadora {Nome = nome});
        }
    }
}
        